package odhgospolhs_omada_kklmm_DBController;

// ΔΗΜΙΟΥΡΓΙΑ ΣΥΝΔΕΣΗΣ ΜΕ ΒΔ OdhgosPolhsDB - ΥΛΟΠΟΙΗΣΗ ΚΛΑΣΗΣ DBManager
// 5-3-2012  last modified by Χ.Κυριαζή
import Odhgos_Polhs.*;
import java.sql.*;
import java.util.logging.Logger;
import java.util.logging.Level;

// import java.util.Iterator; //Για interface
/**
 * Βασισμένο στην ενδεικτική απάντηση Άσκηση 3Α/ΓΕ3/Έτος:2010-2011
 * @author Χρύσα Κυριαζή 
 * Βασισμένο και στην ενδεικτική 4Η ΓΕ/Έτος:2009-2010
 * που έχει συντάξει ο Τ.Αλεφραγκής
 */

// Κλάση DBManager για επικοινωνία με την ΒΔ
public class DBManager {

    private String database = "OdhgosPolhsDB";
    private String user = "teamuser";
    private String password = "kklmm";
    private String driver = "org.apache.derby.jdbc.ClientDriver";
    private String connString = "jdbc:derby://localhost:1527/";
    private Connection dBConnection;
    static Statement statement;

    // Ερωτήματα Εισαγωγής
    private PreparedStatement insertRestaurant; //Εισαγωγή εστιατορίου από Διαχειριστή
    private PreparedStatement insertAjiologhsh;
    private PreparedStatement insertKrathsh;
    private PreparedStatement insertSignedUser;

    
    // Eρωτήματα Τροποποίησης
    private PreparedStatement updateRestaurant; //Τροποποίηση εστιατορίου από Διαχειριστή
    private PreparedStatement updateSignedUser;
    private PreparedStatement updateEvaluation;
    
    // Ερωτήματα Διαγραφής
    private PreparedStatement deleteRestaurant; //Διαγραφή εστιατορίου από Διαχειριστή
    
    // Ερωτήματα Ανάκτησης
    private PreparedStatement selectRestaurants;  //Ανάκτηση όλων των Εστιατορίων
    private PreparedStatement selectArea;         // Επιλογή περιοχής από τον πίνακα PERIOXES
    private PreparedStatement selectCategory;     // Επιλογή κατηγορίας από τον πίνακα KATHGORIES
    private PreparedStatement selectPriceRange;   // Επιλογή εύρους τιμών από τον πίνακα EVROS_TIMWN
    private PreparedStatement selectFotos;        // Επιλογή φωτογραφιών από αρχείο φωτογραφιών
    protected PreparedStatement selectUsers;
    private PreparedStatement selectEvaluations;
    private PreparedStatement selectReservations;
    private PreparedStatement selectOneRestaurant;
    
    
    // Ερωτήματα Αναζήτησης
    private PreparedStatement selectRestByName;
    private PreparedStatement selectRestByArea;
    private PreparedStatement selectRestByCategory;
    private PreparedStatement selectRestByPrice;
    private PreparedStatement selectAdminForLogin;
    private PreparedStatement selectUserForLogin;
    
    /*   Constructor (δημιουργός) της DBManager
     *   Αρχικοποιεί την επικοινωνία με τη ΒΔ και προετοιμάζει
     *   τα απαιτούμενα ερωτήματα.
     */
    public void DBManager(){
        try{
        // Φόρτωση της κλάσης Οδηγού της Βάσης Δεδομένων
            Class.forName(driver);
        // Σύνδεση με τη Βάση Δεδομένων
            dBConnection = DriverManager.getConnection(connString+database, user, password);
            statement = dBConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);            
            
        //Εισαγωγή από τον Διαχειριστή
            insertRestaurant=dBConnection.prepareStatement("INSERT INTO APP.RESTAURANT (RESTID,RESTNAME,RESTADDRESS,AREACODE,RESTPHONENUM,RESTINFO,RESTDESCRIPTION,CATEGORYID,PRICEID,PHOTO) VALUES (?,?,?,?,?,?,?,?,?,?)");
            insertAjiologhsh=dBConnection.prepareStatement("INSERT INTO APP.AJIOLOGHSEIS (EVALID,RESTID,USERNAME,QUALITY,PRICE,SERVICETIME,AVERAGE) VALUES(?,?,?,?,?,?,?)");
            insertKrathsh=dBConnection.prepareStatement("INSERT INTO APP.KRATHSEIS (RESERVEID,RESTID,USERNAME,AITHSHKRATHSHS,KATASTASHKRATHSHS,DATEKRATHSHS,EPIVEVAIOSH)VALUES(?,?,?,?,?,?,?)");
        
        //Ενημέρωση - Τροποποίηση στοιχείων 
            updateRestaurant=dBConnection.prepareStatement("UPDATE APP.RESTAURANT SET RESTNAME=?,RESTADDRESS=?,AREACODE=?,RESTPHONENUM=?,RESTDESCRIPTION=?,RESTINFO=?,CATEGORYID=?,PRICEID=?,PHOTO=?)");
            updateSignedUser=dBConnection.prepareStatement("UPDATE APP.SIGNEDUSER SET USERNAME=?,PASSWORD=?,EMAIL=?,EPONYMO=?,ONOMA=?,TELEPHONE=?)");
            updateEvaluation=dBConnection.prepareStatement("UPDATE APP.AJIOLOGHSEIS SET EVALID=?,RESTID=?,USERNAME=?,QUALITY=?,PRICE=?,SERVICETIME=?,AVERAGE=?)");

        //Διαγραφή 
            deleteRestaurant = dBConnection.prepareStatement("DELETE * FROM APP.RESTAURANT WHERE RESTID=?");
        
        //Επιλογή από πίνακες - Εστιατόριο - Περιοχές - Κατηγορίες - Εύρος Τιμών
            selectRestaurants = dBConnection.prepareStatement("SELECT * FROM APP.RESTAURANT ORDER BY RESTNAME");
            selectArea = dBConnection.prepareStatement("SELECT * FROM PERIOXES WHERE AREACODE=?");
            selectCategory = dBConnection.prepareStatement("SELECT * FROM KATHGORIES");
            selectPriceRange = dBConnection.prepareStatement("SELECT * FROM EVROS_TIMWN");
            selectFotos = dBConnection.prepareStatement("SELECT PHOTO FROM RESTAURANT");
                        
        //Επιλογή ενός εστιατορίου από τον πίνακα Εστιατόριο
            selectOneRestaurant = dBConnection.prepareStatement("SELECT * FROM RESTAURANT WHERE RESTID=?");
        
        //Επιλογή Εγγεγρ.Χρηστών από τον πίνακα Χρηστών
            selectUsers = dBConnection.prepareStatement("SELECT * FROM SIGNEDUSER");
            
        // Επιλογή Αξιολογήσεων από τον πίνακα Αξιολογήσεις    
            selectEvaluations = dBConnection.prepareStatement("SELECT * FROM APP.AJIOLOGHSEIS");
            
        // Επιλογή Κρατήσεων από τον πίνακα Κρατήσεις
            selectReservations = dBConnection.prepareStatement("SELECT * FROM APP.KRATHSEIS");
        
        //Επιλογή χρήστη από τον πίνακα SignedUsers για το login
            selectUserForLogin = dBConnection.prepareStatement("SELECT USERNAME,PASSWORD,ISADMIN FROM SIGNEDUSER");
                    
        //Eπιλογή κριτηρίων για Αναζήτηση με Όνομα, με Περιοχή, με Κατηγορία, με Εύρος Τιμών
            selectRestByName = dBConnection.prepareStatement("SELECT * FROM RESTAURANT WHERE RESTAURANT.RESTNAME = ?");
            selectRestByArea = dBConnection.prepareStatement("SELECT * FROM RESTAURANT, PERIOXES WHERE RESTAURANT.AREACODE=? AND RESTAURANT.AREACODE = PERIOXES.AREACODE");
            selectRestByCategory = dBConnection.prepareStatement("SELECT * FROM RESTAURANT,KATHGORIES WHERE RESTAURANT.CATEGORYID=? AND RESTAURANT.CATEGORYID = KATHGORIES.CATEGORYID");
            selectRestByPrice = dBConnection.prepareStatement("SELECT * FROM RESTAURANT,EVROS_TIMWN WHERE RESTAURANT.PRICEID=? AND RESTAURANT.PRICEID = EVROS_TIMWN.PRICEID");
               
        }catch(Exception exc){
            System.err.println(exc);
        }
    }//End Method DBManager
    
   
  //  ΕΣΤΙΑΤΟΡΙΑ
   /* Μέθοδος για το γέμισμα της βάσης των Εστιατορίων
    *  Αποθήκευση στη βάση ενός εστιατορίου
    */
   
    public void storeRestaurant(Restaurant rest){
        try {
             
            insertRestaurant=dBConnection.prepareStatement("INSERT INTO APP.RESTAURANT (RESTID,RESTNAME,RESTADDRESS,AREACODE,RESTPHONENUM,RESTINFO,RESTDESCRIPTION,CATEGORYID,PRICEID,PHOTO) VALUES (?,?,?,?,?,?,?,?,?,?)");
            insertRestaurant.setInt(1, rest.getID());
            insertRestaurant.setString(2,rest.getName());
            insertRestaurant.setString(3,rest.getAddress());
            insertRestaurant.setInt(4,rest.getArea().getID());
            insertRestaurant.setString(5,rest.getTelephone());  
            insertRestaurant.setString(6,rest.getDescription());
            insertRestaurant.setString(7,rest.getInfo());
            insertRestaurant.setInt(8,rest.getCategory().getID());
            insertRestaurant.setInt(9,rest.getPriceRange().getID());
            //insertRestaurant.setBlob(10,rest.getImage());
          } catch (SQLException ex) {
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

 
    
// T E S T I N G //
    
     // Γέμισμα της ΒΔ με data για testing
     /* public void initializeDB(){
        try {
            PreparedStatement addRestaurant1 = dBConnection.prepareStatement("INSERT INTO RESTAURANT (RESTNAME, RESTADDRESS, AREACODE, RESTPHONENUM, RESTINFO, CATEGORYID, PRICEID, RESTDESCRIPTION,PHOTO) "
                    + "VALUES ('ΨΩΜΙ & ΑΛΑΤΙ','Πλ. Ελευθερωτών 8',15231,2106848178,'Σάβ.-Κυρ. & μεσημ. Κλειστά Δευτ.',2,4,'Η γαστροταβέρνα του «MasterChef» Γιάννη Λουκάκου δίνει γαστρονομικό χρώμα σε αγαπημένους μεζέδες και δημιουργεί ένα νέο ελληνικό γευστικό ρεπερτόριο. Αδιαχώρητο, για κάθε είδους κοινό.','http://lmnts.athinorama.gr/lmnts_lmnts_/umami/article_images/3837/main.jpg')");
            PreparedStatement addRestaurant2 = dBConnection.prepareStatement("INSERT INTO RESTAURANT (RESTID, RESTNAME, RESTADDRESS, AREACODE, RESTPHONENUM, RESTINFO, CATEGORYID, PRICEID, RESTDESCRIPTION,PHOTO) "
                    + "VALUES (2, 'ΤΑ ΡΩΜΑΝΑΚΙΑ','Λεωφ. Μεσογείων 366 & Κοραή 1',15341,2106532278,' Και μεσημ.',1,3,'Δύο Ρωμανάκηδες έστησαν ένα μαγαζί-βέρο κρητικάκι. Πολλές παραδοσιακές συνταγές, γρήγορο σέρβις. Τρ. λυχναροβραδιά, Τετ. κρητική βραδιά.','http://lmnts.athinorama.gr/lmnts_lmnts_/articles/11563/list.jpg');");
            PreparedStatement addRestaurant3 = dBConnection.prepareStatement("INSERT INTO RESTAURANT (RESTID, RESTNAME, RESTADDRESS, AREACODE, RESTPHONENUM, RESTINFO, CATEGORYID, PRICEID, RESTDESCRIPTION,PHOTO) "
                    + "VALUES (3,'ΕΔΩΔΗ','Βεΐκου 80, Κουκάκι',11741,2109213013,'Κλειστά Κυρ.',3,12,'Υψηλή γαστρονομία με αξιοσημείωτη σταθερότητα στο old fashioned εστιατόριο των αδερφών Λυτρίβη. Γοητευτική η «θεατρική» παρουσίαση των πιάτων. Χρυσός Σκούφος 2011.','http://lmnts.athinorama.gr/lmnts_lmnts_/articles/11534/list.jpg');");
            addRestaurant1.executeUpdate();
            addRestaurant2.executeUpdate();
            addRestaurant3.executeUpdate();

            
            PreparedStatement addAdmin = dBConnection.prepareStatement("INSERT INTO SIGNEDUSER VALUES ('admin','admin','dkout2008@gmail.com','Κουτουνίδης','Δημήτριος','2106565656',1);");
            PreparedStatement addRegUser1 = dBConnection.prepareStatement("INSERT INTO SIGNEDUSER VALUES ('dm','kklmm','dm@gmail.com','Μανώλη','Δήμητρα','2116061601',0);");
            PreparedStatement addRegUser2 = dBConnection.prepareStatement("INSERT INTO SIGNEDUSER VALUES ('MikeJohnson','22222','mike.johnson@foo.com','Johnson','Mike','2102323232',0);");
            PreparedStatement addRegUser3 = dBConnection.prepareStatement("INSERT INTO SIGNEDUSER VALUES ('jamesStill','33333','james.still@foo.com','Still','James', '6944556677',0);");
            PreparedStatement addRegUser4 = dBConnection.prepareStatement("INSERT INTO SIGNEDUSER VALUES ('JerStal','44444','jerilyn.stall@foo.com','Stall','Jeri', '2112121212',0);");
            PreparedStatement addRegUser5 = dBConnection.prepareStatement("INSERT INTO SIGNEDUSER VALUES ('PaulPap','23423','paul.papajim@foo.com','Παπαδημητρίου','Παύλος', '2106551445',0);");
            addAdmin.executeUpdate();
            addRegUser1.executeUpdate();
            addRegUser2.executeUpdate();
            addRegUser3.executeUpdate();
            addRegUser4.executeUpdate();
            addRegUser5.executeUpdate();
     
            PreparedStatement addArea1 = dBConnection.prepareStatement("INSERT INTO PERIOXES VALUES (15231,'ΧΑΛΑΝΔΡΙ');");
            PreparedStatement addArea2 = dBConnection.prepareStatement("INSERT INTO PERIOXES VALUES (15341,'ΑΓΙΑ ΠΑΡΑΣΚΕΥΗ');");
            PreparedStatement addArea3 = dBConnection.prepareStatement("INSERT INTO PERIOXES VALUES (11741,'ΚΟΥΚΑΚΙ');");
            addArea1.executeUpdate();
            addArea2.executeUpdate();
            addArea3.executeUpdate();
           
    } catch (SQLException ex) {
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
        }     
  }
 
*/
    
    
   // μέθοδος για να καθαριστεί η βάση βγαίνοντας από το πρόγραμμα
    public void clearDB() {
        try {
            PreparedStatement deleteRestaurants = dBConnection.prepareStatement("DELETE FROM APP.RESTAURANT");
            PreparedStatement deleteAreas = dBConnection.prepareStatement("DELETE FROM APP.PERIOXES");
            PreparedStatement deleteCategories = dBConnection.prepareStatement("DELETE FROM APP.KATHGORIES");
            PreparedStatement deletePriceRange = dBConnection.prepareStatement("DELETE FROM APP.EVROS_TIMWN");
            PreparedStatement deleteEvaluations = dBConnection.prepareStatement("DELETE FROM APP.AJIOLOGHSEIS");
            PreparedStatement deleteReservations = dBConnection.prepareStatement("DELETE FROM APP.KRATHSEIS");
            PreparedStatement deleteUsers = dBConnection.prepareStatement("DELETE FROM APP.SIGNEDUSER");
            deleteRestaurants.executeUpdate();
            deleteAreas.executeUpdate();
            deleteCategories.executeUpdate();
            deletePriceRange.executeUpdate();
            deleteEvaluations.executeUpdate();
            deleteReservations.executeUpdate();
            deleteUsers.executeUpdate();
     
        } catch (SQLException ex) {
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
   
    
} // End class DBManager
